Configuratiebestand toevoegen aan de PostcodeApp
Home

Configuratiebestand toevoegen aan de PostcodeApp

Configuratiebestand toevoegen aan de PostcodeApp

De naam van de provider Data/Postcode was toe nu toe hard gecodeerd in de PostcodeApp. Als we van naam willen veranderen moeten we overal in de code de naam gaan aanpassen. Het is een goed idee om zo'n gegevens in een configuratie bestand op de slaan. .NET Core beschikt over een pakket waarmee je dat kan doen: De .NET Core configuratie API.
Daarnaast gaan we DI gebruiken om de configuratie te injecteren in onze PostcodeApp. De app is immers afhankelijk van de configuratie en we willen ervoor zorgen dat we op een gemakkelijke manier, indien nodig, een andere configuratie voor onze app kunnen gebruiken.

Stappenplan

  1. Om de configuratie api te kunnen gebruiken moet je het Microsoft Extensions.Configuration NuGet-pakket toevoegen aan je applicatie. In de NuGet Package Manager Console typ je (kies de versie voor .NET Core 2.0)Module Vincent: We gebruiken andere versies voor .NET Core 3.0.:
    PM> Install-Package Microsoft.Extensions.Configuration -Version 2.0.0
    Vincent: Maak daarvan versie 3.0.0
  2. We hebben nog de volgende pakketten nodig:
    PM> Install-Package Microsoft.Extensions.Configuration.Json -Version 2.0.0
    PM> Install-Package Microsoft.Extensions.Configuration.FileExtensions -Version 2.0.0
    PM> Install-Package Microsoft.Extensions.Options.ConfigurationExtensions -Version 2.0.0
    
    Vincent: telkens 3.0.0.
  3. Voeg in de root van je project een bestand toe met de naam appsettings.json:
    {
      "Configuration": {
        "ConnectionString": "Data/Postcode"
      }
    }
    We voorzien de nodige eigenschappen om later in de module een SQL connectiestring te kunnen toevoegen.
  4. Maak een bestand met de naam AppSettings.cs met daarin een klasse met de naam AppSettings en de volgende eigenschappen:
    namespace PostcodeApp
    {
        public class AppSettings
        {
            public string ConnectionString { get; set; }
        }
    }
  5. Update de Program.ConfigureServices methode in de Program klasse:
    private static void ConfigureServices(IServiceCollection serviceCollection)
    {
        // build configuration
        var configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", false)
            .Build();
        serviceCollection.AddOptions();
        serviceCollection.Configure<AppSettings>(configuration.GetSection("Configuration"));
        // add services
        serviceCollection.AddSingleton<Dal.IPostcode>(p => new Dal.PostcodeJson(new Bll.Postcode()));
        // add app
        serviceCollection.AddTransient<App>();
    }
    We gebruiken een ConfigurationBuilder object om:
    1. een absoluut pad in te stellen naar waar het appsettings.json bestaat staat;
    2. het appsettings.json bestand toe te voegen aan het IConfigurationRoot object;/li>
    3. een IConfigurationRoot-object te maken en te retourneren
    Tenslotte registreren de IConfigurationRoot instantie en binden het aan Options.
  6. Om de configuratie te gebruiken wijzigen we de App klasse in het App.cs bestand. We injecteren een IOptions<T> van het type AppSettings. Dit betekent dat we een object krijgen dat ons appsettings.json config bestand heeft deserialized in dat object. En we gebruiken de ConnectionString eigenschap van dat object om de naam op de geven van het storage bestand:
    using Microsoft.Extensions.Options;
    using System;
    
    namespace PostcodeApp
    {
        public class App
        {
            private readonly Dal.IPostcode postcodeDal;
            private readonly AppSettings appSettings;
    
            public App(Dal.IPostcode postcodeDal, IOptions<AppSettings> appSettings)
            {
                this.postcodeDal = postcodeDal;
                this.appSettings = appSettings.Value;
            }
    
            public void Run()
            {
                Console.WriteLine("De Postcode App Generic");
                // set the datasource from appsettings.json
                postcodeDal.ConnectionString = appSettings.ConnectionString;
                postcodeDal.ReadAll();
                Console.WriteLine(postcodeDal.Message);
                View.PostcodeConsole view = new View.PostcodeConsole(postcodeDal.Postcode);
                view.List();
                // serialize to another file
                postcodeDal.ConnectionString = $"{appSettings.ConnectionString}3";
                postcodeDal.Create();
                Console.WriteLine(postcodeDal.Message);
            }
        }
    }

JI
2017-10-17 12:31:07